#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
跨网络权限管理配置工具
支持100+用户的基于权限的患者管理系统
"""

import os
import sys
import socket
import subprocess
import time
import webbrowser

def get_local_ip():
    """获取本机IP地址"""
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(("8.8.8.8", 80))
        ip = s.getsockname()[0]
        s.close()
        return ip
    except:
        return "localhost"

def check_server_status():
    """检查权限管理服务器状态"""
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(2)
        result = sock.connect_ex(('localhost', 8080))
        sock.close()
        return result == 0
    except:
        return False

def show_welcome():
    """显示欢迎信息"""
    print("""
╔══════════════════════════════════════════════════════════╗
║           基于权限的跨网络患者管理系统配置工具            ║
║                                                          ║
║  👥 权限控制: 普通用户 | 科室管理员 | 超级管理员           ║
║  🌐 跨网络: 支持不同网络环境的实时数据传输               ║
║  📊 实时性: 患者信息实时推送给有权限的用户               ║
╚══════════════════════════════════════════════════════════╝
    """)

def show_network_options():
    """显示网络配置选项"""
    local_ip = get_local_ip()
    
    print(f"""
🌐 跨网络配置方案:

📊 当前服务器状态:
  • 本机IP: {local_ip}
  • 服务器端口: 8080
  • 服务器状态: {'✅ 运行中' if check_server_status() else '❌ 未运行'}

🔥 方案1: 移动热点 (推荐 - 最简单)
  ✅ 完全免费
  ✅ 无需额外软件
  ✅ 5分钟配置完成
  📋 步骤: 开启热点 → 设备连接 → 更新配置

☁️ 方案2: Cloudflare Tunnel (推荐 - 最稳定)
  ✅ 免费且稳定
  ✅ 支持HTTPS
  ✅ 全球访问
  📋 步骤: 下载工具 → 启动隧道 → 更新配置

🔧 方案3: ngrok (需要注册)
  ⚠️ 需要免费注册
  ⚠️ 有时间限制
  ✅ 配置简单
  📋 步骤: 注册账号 → 获取Token → 启动隧道

🏢 方案4: 企业级云服务 (生产环境)
  💰 需要费用
  ✅ 高可用性
  ✅ 无限制
  📋 适用: 正式部署环境
    """)

def setup_mobile_hotspot():
    """配置移动热点方案"""
    local_ip = get_local_ip()
    
    print(f"""
📱 移动热点配置 (最推荐方案)

📋 配置步骤:
1. 🔥 开启手机移动热点
   - 打开手机设置
   - 找到"个人热点"或"移动热点"
   - 开启热点功能
   - 记住热点密码

2. 📱 设备连接热点
   - 模拟器连接热点WiFi
   - 真机连接热点WiFi
   - 确保所有设备在同一网络

3. 🔍 确认网络配置
   - 服务器IP: {local_ip}
   - WebSocket地址: ws://{local_ip}:8080

4. 📱 更新Android配置
    """)
    
    # 更新Android配置
    update_android_config(f"{local_ip}:8080")
    
    print(f"""
✅ 移动热点配置完成！

📝 下一步测试:
1. 重新编译APK: gradlew assembleRelease
2. 安装到设备: adb install -r app/build/outputs/apk/release/app-release.apk
3. 使用测试账号登录验证权限

👥 测试账号:
  • 超级管理员: admin / admin123
  • 内科主任: dept_admin_neike / dept123
  • 内科医生: user_neike1 / user123
  • 外科医生: user_waike1 / user123

🧪 测试场景:
  • 内科医生添加患者 → 内科主任实时收到通知
  • 外科医生添加患者 → 内科主任看不到
  • 超级管理员能看到所有患者信息
    """)

def setup_cloudflare_tunnel():
    """配置Cloudflare Tunnel方案"""
    print("""
☁️ Cloudflare Tunnel 配置

📥 下载工具:
1. 访问: https://github.com/cloudflare/cloudflared/releases/latest
2. 下载: cloudflared-windows-amd64.exe
3. 重命名为: cloudflared.exe
4. 放置到当前目录

🚀 启动隧道:
    """)
    
    # 检查cloudflared是否存在
    if os.path.exists('cloudflared.exe'):
        print("✅ 找到 cloudflared.exe")
        
        # 创建启动脚本
        create_cloudflare_script()
        
        print("""
✅ Cloudflare Tunnel 配置完成！

📝 启动步骤:
1. 运行: start_cloudflare_tunnel.bat
2. 等待获取公网地址 (https://xxx.trycloudflare.com)
3. 复制地址并更新Android配置
4. 测试跨网络连接

💡 注意事项:
  • 每次重启会获得新地址
  • 需要保持tunnel运行
  • 支持全球访问
        """)
    else:
        print("❌ 未找到 cloudflared.exe")
        
        download = input("是否打开下载页面? (y/N): ").strip().lower()
        if download in ['y', 'yes']:
            webbrowser.open("https://github.com/cloudflare/cloudflared/releases/latest")
            print("📥 浏览器已打开下载页面")
            print("下载完成后重新运行此脚本")

def create_cloudflare_script():
    """创建Cloudflare启动脚本"""
    script_content = '''@echo off
chcp 65001 >nul
title 权限管理系统 - Cloudflare Tunnel
color 0A

echo.
echo ========================================================
echo     基于权限的患者管理系统 - Cloudflare Tunnel
echo ========================================================
echo.

echo 🔍 检查权限管理服务器...
netstat -an | findstr :8080 >nul
if %errorlevel% neq 0 (
    echo ❌ 权限管理服务器未运行
    echo 💡 请先启动: python permission_based_websocket_server.py
    pause
    exit /b 1
)
echo ✅ 权限管理服务器运行正常

echo.
echo 🚀 启动 Cloudflare Tunnel...
echo 📝 创建跨网络隧道中...
echo ⏳ 获取公网地址 (30-60秒)...
echo.
echo 💡 成功后会显示类似地址: https://abc123.trycloudflare.com
echo 📋 请复制该地址用于Android配置
echo.
echo ⏹️ 按 Ctrl+C 停止隧道
echo.

cloudflared.exe tunnel --url localhost:8080

echo.
echo ⚠️ 隧道已停止
pause
'''
    
    with open('start_cloudflare_tunnel.bat', 'w', encoding='utf-8') as f:
        f.write(script_content)
    
    print("✅ 启动脚本已创建: start_cloudflare_tunnel.bat")

def update_android_config(server_address):
    """更新Android配置"""
    print(f"📱 更新Android配置: {server_address}")
    
    try:
        # 更新WebSocketManager配置
        websocket_file = "app/src/main/java/com/example/myapplication/realtime/WebSocketManager.kt"
        
        if os.path.exists(websocket_file):
            with open(websocket_file, 'r', encoding='utf-8') as f:
                content = f.read()
            
            # 确保URL格式正确
            if server_address.startswith(('http://', 'https://')):
                ws_url = server_address.replace('https://', 'wss://').replace('http://', 'ws://')
            else:
                ws_url = f"ws://{server_address}"
            
            # 更新服务器地址
            import re
            
            # 更新PUBLIC_SERVER_URL
            pattern = r'private const val PUBLIC_SERVER_URL = "ws[s]?://[^"]*"'
            replacement = f'private const val PUBLIC_SERVER_URL = "{ws_url}"'
            
            if 'PUBLIC_SERVER_URL' in content:
                content = re.sub(pattern, replacement, content)
            else:
                # 添加新配置
                content = content.replace(
                    'class WebSocketManager',
                    f'class WebSocketManager'
                )
                content = content.replace(
                    'private val isConnected = AtomicBoolean(false)',
                    f'private const val PUBLIC_SERVER_URL = "{ws_url}"\n    private val isConnected = AtomicBoolean(false)'
                )
            
            with open(websocket_file, 'w', encoding='utf-8') as f:
                f.write(content)
            
            print(f"✅ Android配置已更新: {ws_url}")
            return True
        else:
            print("❌ WebSocketManager.kt 文件不存在")
            return False
            
    except Exception as e:
        print(f"❌ Android配置更新失败: {e}")
        return False

def create_test_script():
    """创建测试脚本"""
    test_script = '''#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
权限管理系统测试工具
"""

import asyncio
import websockets
import json
import sys

async def test_permission_system(server_url):
    """测试权限管理系统"""
    print(f"🧪 测试权限管理系统: {server_url}")
    
    # 转换为WebSocket URL
    if server_url.startswith('https://'):
        ws_url = server_url.replace('https://', 'wss://')
    elif server_url.startswith('http://'):
        ws_url = server_url.replace('http://', 'ws://')
    else:
        ws_url = f"ws://{server_url}"
    
    try:
        async with websockets.connect(ws_url, timeout=10) as websocket:
            print("✅ WebSocket连接成功")
            
            # 接收连接确认
            response = await websocket.recv()
            data = json.loads(response)
            
            if data.get('type') == 'CONNECTION_ACK':
                print("✅ 权限管理服务器响应正常")
                
                # 测试管理员认证
                auth_message = {
                    "type": "AUTH",
                    "data": {
                        "username": "admin",
                        "password": "admin123"
                    }
                }
                
                await websocket.send(json.dumps(auth_message))
                response = await websocket.recv()
                auth_data = json.loads(response)
                
                if auth_data.get('type') == 'AUTH_SUCCESS':
                    user_info = auth_data.get('data', {}).get('user_info', {})
                    permissions = auth_data.get('data', {}).get('permissions', {})
                    
                    print("✅ 管理员认证成功")
                    print(f"👤 用户: {user_info.get('real_name')} ({user_info.get('user_type')})")
                    print(f"🏢 科室: {user_info.get('department')}")
                    print("🔐 权限:")
                    print(f"  • 添加患者: {permissions.get('can_add_patients')}")
                    print(f"  • 查看所有患者: {permissions.get('can_view_all_patients')}")
                    print(f"  • 查看科室患者: {permissions.get('can_view_department_patients')}")
                    print(f"  • 审批用户: {permissions.get('can_approve_users')}")
                    
                    print("🎉 权限管理系统测试成功！")
                    return True
                else:
                    print("❌ 管理员认证失败")
                    return False
            else:
                print("⚠️ 服务器响应异常")
                return False
                
    except Exception as e:
        print(f"❌ 测试失败: {e}")
        return False

if __name__ == "__main__":
    if len(sys.argv) != 2:
        server_url = input("请输入服务器地址 (如 localhost:8080): ")
    else:
        server_url = sys.argv[1]
    
    result = asyncio.run(test_permission_system(server_url))
    
    if result:
        print("\\n✅ 系统测试通过！")
        print("📱 现在可以在Android设备上进行权限测试")
    else:
        print("\\n❌ 系统测试失败，请检查配置")
'''
    
    with open('test_permission_system.py', 'w', encoding='utf-8') as f:
        f.write(test_script)
    
    print("✅ 测试脚本已创建: test_permission_system.py")

def main():
    """主函数"""
    show_welcome()
    
    # 检查服务器状态
    if not check_server_status():
        print("❌ 权限管理服务器未运行")
        print("💡 请先启动服务器:")
        print("   python permission_based_websocket_server.py")
        
        start_server = input("\n是否现在启动服务器? (y/N): ").strip().lower()
        if start_server in ['y', 'yes']:
            print("🚀 正在启动权限管理服务器...")
            subprocess.Popen([sys.executable, 'permission_based_websocket_server.py'])
            time.sleep(3)
            
            if check_server_status():
                print("✅ 服务器启动成功")
            else:
                print("❌ 服务器启动失败，请手动启动")
                return
        else:
            return
    else:
        print("✅ 权限管理服务器运行正常")
    
    show_network_options()
    
    while True:
        choice = input("\\n请选择跨网络方案 (1-4, q退出): ").strip()
        
        if choice.lower() == 'q':
            break
        elif choice == '1':
            setup_mobile_hotspot()
            break
        elif choice == '2':
            setup_cloudflare_tunnel()
            break
        elif choice == '3':
            print("\\n🔧 ngrok配置:")
            print("1. 访问 https://ngrok.com 注册账号")
            print("2. 获取authtoken")
            print("3. 运行: ngrok config add-authtoken YOUR_TOKEN")
            print("4. 运行: ngrok http 8080")
            print("5. 复制地址并更新Android配置")
            break
        elif choice == '4':
            print("\\n🏢 企业级云服务:")
            print("请参考: 阿里云实施指南.md")
            print("预计费用: ¥1950/月")
            print("支持用户: 200+")
            break
        else:
            print("❌ 无效选择，请重试")
    
    # 创建测试脚本
    create_test_script()
    
    print(f"""
🎯 配置完成！

📝 后续步骤:
1. 重新编译APK: gradlew assembleRelease
2. 安装到设备: adb install -r app/build/outputs/apk/release/app-release.apk
3. 使用测试账号进行权限验证
4. 测试跨网络实时数据传输

📖 详细指南: 跨网络权限管理配置指南.md
🧪 系统测试: python test_permission_system.py

🌐 完成后支持基于权限的跨网络实时患者管理！
    """)

if __name__ == "__main__":
    main() 